package rickyGame.game
{
	import comp.Label;
	import comp.UIComponent;
	
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	import flash.utils.getTimer;
	
	import ricky.Interface.IGraphic;
	import ricky.animate.Animate;
	import ricky.game.Actor;
	import ricky.game.Actor2D;
	import ricky.quadtree.Leaf;
	import ricky.quadtree.Quadtree;
	import ricky.scene.Camera;
	import ricky.scene.MapLayout;
	import ricky.scene.MiniMap;
	import ricky.scene.Scene;
	import ricky.utils.FrameManager;
	import ricky.utils.TimeServer;
	
	import rickyGame.controller.Controller;
	import rickyGame.events.SceneEvent;
	import rickyGame.game.Player;
	import rickyGame.game.graphic.FightGraphic;
	import rickyGame.game.graphic.PlayerGraphic;
	import rickyGame.game.scene.Pathfinder;
	import rickyGame.game.scene.SceneManager;
	import rickyGame.net.MsgType;
	import rickyGame.net.SocketProxy;
	import rickyGame.net.WorkQueue;
	import rickyGame.net.handler.Handler;
	import rickyGame.ui.UIManager;
	import rickyGame.ui.Welcome;
	
	/**
	* 游戏状态
	 * 对游戏世界当前状态的整体描述进行访问的构件 其他游戏模块可以通过“游戏状态”	查询游戏世界中任何物体的当前状态 
	 */
	public class GameState
	{

		public function get scene():Scene
		{
			return _scene;
		}

		public function get initialized():Boolean
		{
			return _initialized;
		}

		/**
		 * 根场景 sprite
		 */
		public function get root():Sprite
		{
			return _root;
		}

		/**
		 * 游戏舞台
		 */
		public function get stage():Stage
		{
			return _stage;
		}

		public static function get inst():GameState
		{
			if(_instance==null)
			{
				_instance =new GameState();
			}
			
			return _instance;
		}
		
		public function GameState()
		{
			_realTime=new Date();
//			_plays=new Array;
			_sceneManager=new SceneManager();
			_sceneManager.addEventListener(SceneEvent.SCENE_LOADED,onSceneLoaded);
		}
		
		/**
		 * 初使化游戏
		 */
		public function init(root:Sprite):void
		{
			if(root!=null)
			{
				_stage=root.stage;
				_sceneManager.stage=this._stage;
				FrameManager.inst.stage=_stage;
				_root=root;
				
//				_ui=new UIComponent();
//				_ui.initialize();
				
				UIManager.inst.uiLayer=new UIComponent();
				_stage.addChild(UIManager.inst.uiLayer);
//				_ui.addChild(new Stats());

			}
			_initialized=true;
		}
		
		/**
		 * 得到游戏中的时间
		 */
		public function getTimes():Number
		{
			return new Date().time;
		}
		
//		/**
//		 * 得到游戏中的所有玩家
//		 */
//		public function get plays():Array
//		{
//			return _plays;
//		}
		
//		/**
//		 * 通过ID得到玩家
//		 */
//		public function getPlayerByID(playerID:uint):Actor
//		{
//			for(var i:String in _plays)
//			{
//				if(_plays[i].id==playerID)
//					return _plays[i];  
//			}
//			return null;
//		}
		
//		/**
//		 * 删除玩家删除后不再游戏世界中
//		 */
//		public function killGameObject(obj:Actor2D):Boolean
//		{
//			var r:Boolean=false;
//			var i:int=_plays.indexOf(obj);
//			
//			if(i!=-1)
//				_plays.splice(i,1);
//			
//			if(obj)
//			{
//				obj.active=false;
//				obj.isLock=true;
////				obj.isDead=true;
//				this.sceneManager.killGameObject(obj);
//			}
//			
//			return true;	
//		}
		
//		/**
//		 * 删除玩家
//		 */
//		public function removeGameObject(obj:Actor2D):Boolean
//		{
//			var r:Boolean=false;
//			var i:int=_plays.indexOf(obj);
//
//			if(obj is Actor)
//					Actor(obj).active=false;
//			if(i!=-1)
//				_plays.splice(i,1);
//			
//			this.sceneManager.removeGameObject(obj);
//
//			return true;	
//		}
		
//		/**
//		 * 向游戏中添加玩家
//		 */
//		public function addGameObject(obj:Actor2D):void
//		{
//			var i:int=_plays.indexOf(obj.graphic);
//			if(i==-1)
//			{
//				_plays.push(obj.graphic);
//				if(obj is Actor)
//				{
//					obj.wear();// // wear();
//					Actor(obj).active=true;
//					if(Actor(obj).isLock==true)
//						Actor(obj).isLock=false;
//					if(obj.graphic is FightGraphic)
//						FightGraphic(obj.graphic).showBloodBar();
//					
//					sceneManager.addGameObject(obj);
//				}
//			}
//		}
		
		/**
		 * 游戏输出 
		 */
		public function render(e:Event):void
		{
			
			Controller.instance.updateEvent(e);
			
			sceneManager.orderY();
			
			FrameManager.inst.update(e);
			
			if(this._ismove==false)
			{
//				var dt:Number=now-_lastTime;
//				if(dt>1000)
//				{
//					_lastTime=now;
////					WorkQueue.instance.pushRecive(MsgType.SERVER_SENDPOSITIONTOSERVER,_me,_me.gridX,_me.gridY);
//				}
			}
		}
		
//		public function get uiLayer():UIComponent
//		{
//			return _ui;
//		}
//		
//		/**
//		 * 玩家控制的角色
//		 */
//		public function get me():Player
//		{
//			return _me;
//		}
		
//		public function setMe(value:Player):void
//		{
//			_me=value;
//			_me.stepFunction=stepFunction;
//			_me.onMovingFun=onMovingFun;
//			_me.onArrive=onArrive;
//		}

		public function get sceneManager():SceneManager
		{
			return _sceneManager;
		}

		/**
		 * 游戏是否运行
		 */
		public function get isRunning():Boolean
		{
			return _isRunning;
		}

		public function set isRunning(value:Boolean):void
		{
			_isRunning = value;
			if(_isRunning)
			{
				this.stage.removeEventListener(Event.ENTER_FRAME,render);
				this.stage.addEventListener(Event.ENTER_FRAME,render);
			}else
				this.stage.removeEventListener(Event.ENTER_FRAME,render);
		}

		public function showTips(msg:String):void
		{
			if(tips)
				tips.text=msg;
		}
		//************************ private ****************
		/**
		 * 场景加载完成
		 */
		private function onSceneLoaded(e:SceneEvent):void
		{
			e.scene.camera.width=this.stage.stageWidth;
			e.scene.camera.height=this.stage.stageHeight;
			_camera=e.scene.camera;
//			e.scene.map.mouseClick=InputController.instance.mapClick;
			_scene=e.scene;
			
			sendMTS({"cmd":"Scene","type":1});
//			WorkQueue.instance.pushRecive({"cmd":"l."});
//			WorkQueue.instance.pushRecive(MsgType.SERVER_CLIENTSCENCE_LOADED,_sceneManager.currScene);
		}
		
		/**
		 * 同步位置
		 */
		public function stepFunction(p:Actor):void
		{
//			WorkQueue.instance.pushRecive(MsgType.SERVER_SENDPOSITIONTOSERVER,_me,_me.gridX,_me.gridY);
			var m:MapLayout=this.sceneManager.currScene.map;
			
//			var cl:Leaf=GameState.inst.scene.tree.getLeaf(_me.morton);
//			Pathfinder.clearPath(cl,GameState.inst.scene.map.characterLayout);
//			if(m)
//				m.printBuff();
			
//			var mini:MiniMap=this.sceneManager.miniMap;
//			if(mini)
//			{
//				mini.showInfo(CLocale.getValue("zuobiao",me.gridX,me.gridY)+",角色数量"+this._plays.length);
//			}
		}
		
		
		public function onMovingFun(p:Actor):void
		{
//			_ismove=true;
//			if(me && this._camera)
//			{
//				_camera.offMoving(me.graphic.x,me.graphic.y);
//			}
		}
		
		/**
		 * 显示欢迎界面
		 */
		public function welcome():void
		{
			var w:Welcome=new Welcome();
			w.onComplete=function():void
			{
				w.parent.removeChild(w);
				SocketProxy.connect(CLocale.getValue("host"),9001);
			}
				
			UIManager.inst.uiLayer.addChild(w);
		}
		
		private function onArrive(a:Actor):void
		{
			_ismove=false;
			_lastTime=new Date().time;
		}
		
		//private
		private static var _instance:GameState;//实例
		private var _scene:Scene;//当前场景
		private var _realTime:Date;//当前游戏时间
		private var _root:Sprite;//主sprite
		private var _ismove:Boolean=false;
		private var _lastTime:Number=0;;
		/** 场景管理器  */
		private var _sceneManager:SceneManager;//场景
		private var _stage:Stage;//游戏舞台
		private var _camera:Camera;
		
		private var _isRunning:Boolean=false;
		private var _initialized:Boolean=false;
		
		public var  tips:Label;
	}
}